# asmo-aview

Произведён анализ упаковки программного обеспечения "АСМО Просмотрщик-конвертер" в RPM.

## Объект тестирования

* имя файла: `asmo-aview-6-545-rosa12.x86_64-00.rpm`
* хеш MD5: `84f0a8476dbe7f5a6012ad8c2ade234a`

## Анализ пакета

### Скриптлеты пакеты

В пакете следующие скриптлеты:

```
$ rpm -q --scripts asmo-aview-6-545-rosa12.x86_64-00.rpm 
postuninstall scriptlet (using /bin/sh):
if [ $1 == 0 ];then
rm -rf /opt/asmo/aview
rm -f /usr/share/applications/aview.desktop
rm -f /usr/share/mime/packages/application-x-aview.xml
fi
```

Непонятна необходимость дополнительного удаления данных файлов и директорий. Если информация о них прописана в `%files`, то пакетный менеджер вычистит их сам. Если пакетный менеджер о них не знает, то это недопустимо и необходимо исправить в спеке. Вообще недопустимо менять что-то в системе в обход пакетного менеджера, кроме специфических случаев. Ниже произведён анализ почему эти скрипты вообще нужно убрать.

### Содержимое пакета

### Упакованные файлы

```
$ rpm -ql asmo-aview-6-545-rosa12.x86_64-00.rpm 
/opt/asmo/aview/aview
/opt/asmo/aview/aview-48.png
/opt/asmo/aview/aview.x64
/opt/asmo/aview/create_desktop
/opt/asmo/aview/lib/SparseBitSet-1.2.jar
/opt/asmo/aview/lib/agent.jar
/opt/asmo/aview/lib/aspose-diagram-23.3.jar
/opt/asmo/aview/lib/bcpkix-jdk18on-1.72.jar
/opt/asmo/aview/lib/bcprov-jdk18on-1.72.jar
/opt/asmo/aview/lib/bcutil-jdk18on-1.72.jar
/opt/asmo/aview/lib/commons-codec-1.15.jar
/opt/asmo/aview/lib/commons-collections4-4.1.jar
/opt/asmo/aview/lib/commons-compress-1.21.jar
/opt/asmo/aview/lib/commons-io-2.11.0.jar
/opt/asmo/aview/lib/commons-logging-1.2.jar
/opt/asmo/aview/lib/commons-math3-3.6.1.jar
/opt/asmo/aview/lib/dom4j-1.6.1.jar
/opt/asmo/aview/lib/fontbox-2.0.16.jar
/opt/asmo/aview/lib/freemarker.jar
/opt/asmo/aview/lib/h2.jar
/opt/asmo/aview/lib/image4j.jar
/opt/asmo/aview/lib/itext-pdfa-5.4.2.jar
/opt/asmo/aview/lib/itext-xtra-5.4.2.jar
/opt/asmo/aview/lib/itextpdf-5.4.2.jar
/opt/asmo/aview/lib/jakarta.activation-api-2.0.0-RC3.jar
/opt/asmo/aview/lib/jakarta.activation.jar
/opt/asmo/aview/lib/jakarta.xml.soap-api-2.0.0-RC3.jar
/opt/asmo/aview/lib/jetty-continuation.jar
/opt/asmo/aview/lib/jetty-http.jar
/opt/asmo/aview/lib/jetty-io.jar
/opt/asmo/aview/lib/jetty-security.jar
/opt/asmo/aview/lib/jetty-server.jar
/opt/asmo/aview/lib/jetty-servlet.jar
/opt/asmo/aview/lib/jetty-util.jar
/opt/asmo/aview/lib/js.jar
/opt/asmo/aview/lib/jsoup-1.15.4.jar
/opt/asmo/aview/lib/log4j-api-2.18.0.jar
/opt/asmo/aview/lib/mail.jar
/opt/asmo/aview/lib/myjdbc4.jar
/opt/asmo/aview/lib/netty.jar
/opt/asmo/aview/lib/ojdbc.jar
/opt/asmo/aview/lib/pdfbox-2.0.16.jar
/opt/asmo/aview/lib/pgjdbc4.jar
/opt/asmo/aview/lib/poi-5.2.3.jar
/opt/asmo/aview/lib/poi-excelant-5.2.3.jar
/opt/asmo/aview/lib/poi-ooxml-5.2.3.jar
/opt/asmo/aview/lib/poi-ooxml-full-5.2.3.jar
/opt/asmo/aview/lib/poi-ooxml-lite-5.2.3.jar
/opt/asmo/aview/lib/poi-scratchpad-5.2.3.jar
/opt/asmo/aview/lib/postgis.jar
/opt/asmo/aview/lib/proprapi.jar
/opt/asmo/aview/lib/saaj-impl-2.0.0-M1.jar
/opt/asmo/aview/lib/sdoapi.jar
/opt/asmo/aview/lib/sdoutl.jar
/opt/asmo/aview/lib/serializer-2.7.1.jar
/opt/asmo/aview/lib/servlet-api.jar
/opt/asmo/aview/lib/slf4j-api-1.6.1.jar
/opt/asmo/aview/lib/snmp4j.jar
/opt/asmo/aview/lib/sqljdbc4.jar
/opt/asmo/aview/lib/stax-ex-2.0.0-M2.jar
/opt/asmo/aview/lib/xalan-2.7.1.jar
/opt/asmo/aview/lib/xmlbeans-5.1.1.jar
/opt/asmo/aview/lib/xmlsec-1.5.0.jar
/opt/asmo/aview/lib/zxing-2.1.jar
/opt/asmo/aview/settings/font.ini
/opt/asmo/aview/settings/fonts
/opt/asmo/aview/settings/fonts/PTS55E.ttf
/opt/asmo/aview/settings/fonts/PTS56F.ttf
/opt/asmo/aview/settings/fonts/PTS75F.ttf
/opt/asmo/aview/settings/fonts/PTS76F.ttf
/usr/share/applications/aview.desktop
/usr/share/mime/packages/application-x-aview.xml
```


#### Не все файлы принадлежат пакету

Директории `/opt/asmo/aview` и `/opt/asmo` бесхозные. По всей видимости, поэтому и было принято решение удалять `/opt/asmo/aview` скриптом. Правильно указать в секции `%files` принадлежность директорий пакету с помощью `%dir`, например, [так](https://hub.mos.ru/mos/pkgs/mos-docdir/-/blob/main/mos-docdir.spec#L28). Но `aview.desktop` и `application-x-aview.xml` пакету принадлежат и совершенно непонятно зачем в скрипте понадобилось их дополнительное удаление.

### Зависимости пакета

У пакета следующие зависимости:

```
$ rpm -q --requires asmo-aview-6-545-rosa12.x86_64-00.rpm 
/bin/sh
glibc
java-11-openjdk
lib64GLESv2_2
lib64SDL2_2.0_0
lib64SDL2_image2.0_0
lib64dw1
lib64fontconfig1
lib64freetype6
lib64glib2.0_0
lib64gobject2.0_0
lib64gtk+3_0
lib64x11_6
lib64z1
libGLESv2.so.2()(64bit)
libSDL2-2.0.so.0()(64bit)
libSDL2_image-2.0.so.0()(64bit)
libX11.so.6()(64bit)
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libdw.so.1()(64bit)
libdw.so.1(ELFUTILS_0.122)(64bit)
libfontconfig.so.1()(64bit)
libfreetype.so.6()(64bit)
libgcc_s.so.1()(64bit)
libgcc_s.so.1(GCC_3.0)(64bit)
libgcc_s.so.1(GCC_3.3)(64bit)
libgcc_s.so.1(GCC_3.4)(64bit)
libgcc_s.so.1(GCC_4.2.0)(64bit)
libglib-2.0.so.0()(64bit)
libgobject-2.0.so.0()(64bit)
libgtk-3.so.0()(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.12)(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
librt.so.1()(64bit)
librt.so.1(GLIBC_2.2.5)(64bit)
libstdc++.so.6()(64bit)
libstdc++.so.6(CXXABI_1.3)(64bit)
libstdc++.so.6(CXXABI_1.3.1)(64bit)
libstdc++.so.6(CXXABI_1.3.3)(64bit)
libstdc++.so.6(CXXABI_1.3.5)(64bit)
libstdc++.so.6(CXXABI_1.3.8)(64bit)
libstdc++.so.6(GLIBCXX_3.4)(64bit)
libstdc++.so.6(GLIBCXX_3.4.11)(64bit)
libstdc++.so.6(GLIBCXX_3.4.14)(64bit)
libstdc++.so.6(GLIBCXX_3.4.15)(64bit)
libstdc++.so.6(GLIBCXX_3.4.21)(64bit)
libstdc++.so.6(GLIBCXX_3.4.9)(64bit)
libz.so.1()(64bit)
libz.so.1(ZLIB_1.2.0)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
```

Чтобы пакет был дистрибутивоуниверсальным, рекомендуем использовать зависимости следующего вида: `libfoo.so.N()(64bit)`. RPM может проставить такие зависимости автоматически, если не отключать AutoReq.  Рекомендуем ознакомиться с материалом: https://nixtux.ru/1268

Конкретно в списке зависимостей пакет `lib64GLESv2_2` может в других дистрибутивах называться просто по-другому и из-за этого будут неудовлетворённые зависимости и, как результат, придётся собирать разные rpm для разных дистрибутивов. Правильно будет вместо `lib64GLESv2_2` указать в зависимостях `libGLESv2.so.2()(64bit)`, вместо `lib64SDL2_2.0_0` указать `libSDL2-2.0.so.0()(64bit)` если это прямо точно нужно. А ещё лучше  положиться на RPM, который сам уже проставил такие именно библиотечные зависимости (посмотрите ниже в списке) и только если он что-то пропустит, тогда уже вписывать зависимости вручную.

В качестве проверки я посмотрел по библиотекам, которые упомянул:

```
$ strings aview | grep -i 'libSDL2-2.0.so'
libSDL2-2.0.so.0
$ strings aview | grep -i 'libGLESv2.so'
libGLESv2.so.2
```

И вполне их обнаружил. Будьте уверены, что и RPM их точно так же обнаруживает и автоматически добавляет в в зависимости, что подтверждается списком выше.

## Информация о пакете

```
$ rpm -qi asmo-aview-6-545-rosa12.x86_64-00.rpm 
Name        : aview
Version     : 6
Release     : 545
Architecture: x86_64
Install Date: (not installed)
Group       : Unspecified
Size        : 160428476
License     : -
Signature   : (none)
Source RPM  : aview-6-545.src.rpm
Build Date  : Пт 23 июн 2023 16:02:01
Build Host  : asmo.inform.ivanovo.ru
Summary     : Asmo Viewer
Description :
This package contains the aview(Asmo Viewer)
```


Не указана лицензия, описание и группа. Чтобы в пакетном менеджере пакет был отображён не отдельно непонятно где, следует указать группу к которой относится утилита. Стандартные группы собраны, например, тут: http://wiki.rosalab.ru/en/index.php/Packaging_group

Summary и Description было бы здорово дублировать на русском языке.

```
...

Summary(ru_RU.UTF-8): 
...
%description -l ru_RU.UTF-8
...
```

Пример:

https://hub.mos.ru/mos/pkgs/mos-docdir/-/blob/main/mos-docdir.spec
